/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) 李文友 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef FILEDATA_H
#define FILEDATA_H

#include <QStringList>
#include <QTextStream>
#include <QCryptographicHash>
#include <QRegExp>
#include <QMutex>
#include <QVector>
#include "MacroDefine/GeneralDefine.h"

/**

  注意：本类原先是给webserver 使用的，后面作废，不再使用。
  华磊　２０１８．９．２

  **/


#define D_ROBOT_AXIS_MAX 7


// gSoap lib import
//#include "gSoapFoundation/soapStub.h"
//#include "gSoapFoundation/soapH.h"

 //#include "GeneralDefine.h"
#include "enum.h"
#include "domparser.h"

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The PointPro struct       点信息
 */
struct PointPro
{
    int jointFlag;                  //0:关节;1:笛卡尔;
    int pointNum;                   //点 编号
    int groupNum;                   //组 编号
    int ufValue;                    //用户坐标系 编号
    int utValue;                    //工具坐标系 编号
    int recordStatus;                  //在使用用户坐标系，或者是工具坐标系进行坐标系示教的时候（三点法，四点法，六点法），记录该点的示教状态，０代表未示教　　１代表已经示教
    std::string configString;       //多解 选择;多圈 选择
    std::vector<int> configInt;     //多解 选择;多圈 选择
    std::vector<float> positionValue;//关节值 or 笛卡尔值
    std::vector<float> extPositionValue;//外部轴的值，仅存在关节形式
};
/**
 * @brief The EM_AXIS_UNIT enum             轴单位
 */

/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The PlRegStruct struct    pl寄存器
 */
struct PlRegStruct
{
    int row;//行
    int col;//列
    int layer;//层

};
#endif

enum EM_AXIS_UNIT{
    EM_AXIS_DEG,
    EM_AXIS_MM
};

///**
// * @brief The FileInfo struct      文件信息
// */
//struct FileInfo
//{
//    std::string programName;        //程序名称
//    std::string owner;              //程序创建者
//    std::string comment;            //注释
//    int programSize;                //程序大小
//    std::string createTime;         //创建时间
//    std::string modifiTime;         //修改时间
//    std::string fileName;           //程序名称
//    std::string version;            //程序版本
//    int lineCount;                  //行数
//    int memorySize;
//    std::string protectPro;

//    int templateType;               //中英文模式

//    int tcdStackSize;
//    int tcdTaskPriority;
//    int tcdTimeSlice;
//    int tcdBusyLampOff;
//    int tcdAbortRequest;
//    int tcdPauseRequest;

//    std::string defaultGroup;
//    std::string controlCode;
//};

///**
// * @brief The StackStylePointInfo class     保存示教点信息
// **/
//struct StackStylePointInfo
//{
//    /**
//     * @brief m_nMatrix 堆上示教点位置 【1，2，2】 【R，C，L】【GCODE_STACK_POSITION_RCL_COUNT】
//     **/
//    std::vector <int> rowColumnLayer;
//    /**
//     * @brief m_sStackPoint 点位信息
//     **/
//    PointPro stackPoint;
//};


///**
// * @brief The StackInfo class  码垛初始信息
// **/
//struct StackInfo
//{
//    /**
//     * @brief stackName         码垛名称
//     **/
//    std::string stackName;
//    /**
//     * @brief m_nStackUpDown    堆上、堆下【种类：码垛、拆垛】
//     **/
//    int stackUpDown;
//    /**
//     * @brief m_nRow    行数
//     **/
//    int row;
//    /**
//     * @brief m_nCol    列数
//     **/
//    int col;
//    /**
//     * @brief m_nLayer  层数
//     **/
//    int layer;
//    /**
//     * @brief m_nExecIncr                   增加
//     **/
//    int execIncr;
//    /**
//     *@brief m_nAuxiliary                   是否有辅助点
//     */
//    int auxiliary;
//    /**
//     * @brief m_nExecOrder                  执行顺序 【CRL、RCL】行列层、列行层
//     **/
//    int execOrder;
//    /**
//     * @brief m_nTeachOrder                 示教顺序：1，底层示教；0顶层示教【方向】
//     **/
//    int teachOrder;
//    /**
//     * @brief m_nIntervalEnable             行列层三点示教是否开启：1，开启；0，关闭【开关】正常情况处于关闭状态
//     **/
//    std::vector <int> intervalEnable;
//    /**
//     * @brief m_nIntervalValue              行列层间距值【间距值】当行列层三点示教开启时，可以通过间距值从而减少需要示教的点位信息
//     **/
//    std::vector <float> intervalValue;
//    /**
//     * @brief m_nStackType                  码垛类型：B、BX、E、EX
//     **/
//    int stackType;
//    /**
//     * @brief m_nStackNumber                叠栈号码
//     */
//    int stackNumber;
//    /**
//     * @brief m_nStackProximityCount        接近点数
//     **/
//    int stackProximityCount;
//    /**
//     * @brief m_nStackFleeCount             逃离点数
//     **/
//    int stackFleeCount;
//    /**
//     * @brief m_nStackStyleCount            式样点数
//     **/
//    int stackStyleCount;
//    /**
//     * @brief m_nStackRegister              栈板寄存器号码
//     **/
//    int stackRegisterNumber;
//    /**
//     * @brief m_nStackPointCount            堆上示教点个数
//     **/
//    int stackPointCount;
//    /**
//     * @brief m_nStackFinishOutputMode      码垛完成信号输出模式
//     **/
//    int stackFinishOutputMode;
//    /**
//     * @brief m_nStackFinishOutputDoNum     码垛完成信号输出DO号
//     **/
//    int stackFinishOutputDoNum;
//    /**
//     * @brief stackPointA_n                 接近点
//     **/
//    std::vector <struct PointPro> stackPointA_n;
//    /**
//     * @brief stackPointBTM                 堆叠点
//     **/
//    struct PointPro stackPointBTM;
//    /**
//     * @brief stackPointR_n                 逃离点
//     **/
//    std::vector <struct PointPro> stackPointR_n;
//    /**
//     * @brief m_sStackStylePointInfo        示教点信息
//     **/
//    std::vector <struct StackStylePointInfo> stackStylePointInfo;
//};
/**
 * @brief The FileData class 　计划作废
 */
class FileData : public QObject//无法加锁 原因不明
{
    Q_OBJECT
public:
    FileData();
    ~FileData();

    /**
     * @brief xmlParse              xml操作初始化
     */
    DomParser  xmlParse;
    /**
     * @brief md5Map                xml:所有文件的md5数据
     */
    QMap <int,QMap <QString,QString> > md5Map;
    /**
     * @brief ioMsgData             xml:所有IO的注释
     */
    QVector <QVector <QString> > ioMsgData;

    /**
     * @brief initFileData          FileData初始化
     */
    void initFileData();

    /**
     * @brief axisUnit              轴单位 写文件用缓存
     */
    QVector<int> axisUnit;

    /**
     * @brief currentRobotFileAddress   获取来自机器人消息的地址
     */
    QString currentRobotFileAddress;

    //from serverControl
    /**
     * @brief currentProgramName    当前程序的名字
     */
    QString currentProgramName;
    /**
     * @brief currentFile           当前打开文件　包括路径和文件名
     */
    QString currentFile;
    /**
     * @brief currentFileName       当前打开文件　文件名
     */
    QString currentFileName;
    /**
     * @brief cmdStrList            命令指令
     */
    QStringList cmdStrList;
    /**
     * @brief cmdStrWriteList   编辑后 命令指令(写入操作用):此处原本为控制器接收后的指令长度(即要保存的缓存长度)
     */
    QStringList cmdStrWriteList;
    /**
     * @brief cmdStrWriteSuccess    写文件成功标志
     */
    bool cmdStrWriteSuccess;

    /**
     * @brief rendQuickSuccess      快读文件属性
     */
    bool rendQuickSuccess;

    /**
     * @brief fileProInfo       文件属性
     */
    FileInfo  fileProInfo;
    /**
     * @brief fileProInfoQuick  临时读取文件信息 (预览用)
     */
    FileInfo  fileProInfoQuick;
    /**
     * @brief getPointProList   保存普通点到pointData组件的操作(载入点)
     */
    QVector <PointPro> getPointProList;

    /******************************************
     * 修改人：      李文友
     * 修改时间：　2018-07-28
     * 修改说明：　添加自由导航指令所需的　DP点位
     *
     * ****************************************/
    /**
     * @brief vehicleDPointList             保存自由导航 DP点位数据
     */
    QMap <int, DPoint> vehicleDPointList;

    /**
     * @brief palletStackInfo   保存码垛点到pointData组件的操作
     */
    QVector <StackInfo> palletStackInfo;
    /**
     * @brief regPlList         对接RegData组件的pl寄存器接口
     */
    QVector <PlRegStruct> regPlList;

    /**
     * @brief programList       写操作时候:文件内容每一行的缓存,然后写入
     */
    QVector <QString> programList;

    /**
     * @brief saveAxisUnit      轴单位保存LV1时候获取
     */
    QVector <int > saveAxisUnit;
    QVector <int > saveExtAxisUnit;

    /**
     * @brief normalPointLock   点锁定 操作(每次打开文件都需要清空该 缓存)
     */
    QVector <bool > normalPointLock;

    //写操作用
    int globalDefaultUserNum;

    int globalDefaultToolNum;

    /**
     * @brief writeAllowFLag    是否允许写操作
     */
    bool writeAllowFLag;

    /**
     * @brief readAllowFlag     是否允许读操作
     */
    bool readAllowFlag;

    /**
     * @brief fileOpenFirst     文件是否刚打开(如果是刚打开的,就不会做 是否修改的判断)
     */
    //bool fileOpenFirst;

    /**
     * @brief tabSetFileIndex   当前选中的文件(renView的Tab标签的index,默认0)
     */
    //int tabSetFileIndex;

public:
//    QVector<HmiToolCoordinateInformation> toolInfo;
//    QVector<HmiUserCoordinateInformation> userInfo;

public:
    //文件读写接口 移植from新旧控制器
    /**
     * @brief readProgram       读取全文内容:赋值到全局
     * @param strFilePath
     * @return
     */
    int readProgram(QString strFilePath);

    /**
     * @brief readProgramQuick  只读取属性部分:赋值给fileProInfoQuick(文件预览用)
     * @param strFilePath
     * @return
     */
    int readProgramQuick(QString strFilePath);

    /**
     * @brief readProgramToCode 返回代码部分 run显示需要
     * @param strFilePath
     * @param codeList
     * @return
     */
    int readProgramToCode(QString strFilePath,QStringList &codeList);

    /**
     * @brief writeProgramFile  将程序文件写入文件
     * @param strFilePath       路径
     */
    void writeProgramFile(QString strFilePath);

    /**
     * @brief readProgramToMD5          获取程序md5
     */
    QString readProgramToMD5(QString strFilePath);
    /**
     * @brief readFileToMD5             获取文件md5
     */
    QString readFileToMD5(QString strFilePath);

    //MD5 获取 与检查
    QString getMD5(QString wholePath);
    bool checkMD5(QString checkMD5, QString wholePath);

    /**
     * @brief readXmlMD5                获取xml中MD5信息
     */
    void readXmlMD5();

    //***********************************************************
    /**
     * @brief translateCmdList          翻译
     * @param cmd
     * @return
     */
    QStringList translateCmdList(int language , QStringList cmd);

    /**********************************************************
     * 修改人：　　　李文友
     * 修改时间：　2018-07-28
     * 修改说明：　添加MOVE_FREE自由导航指令数据从文本匹配读取接口
     *             添加MOVE_FREE自由导航指令数据写入文本接口
     * *******************************************************/
    /**
     * @brief readProgramDPointData         从文本中匹配读取DP点位参数
     * @param fileInfoList                  存放文本内容的容器
     * @param vehicleDPointListOut          保存DP点位数据的容器
     * @return
     */
    int readProgramDPointData(QVector <QString> fileInfoList, QMap <int, DPoint> &vehicleDPointListOut);

    /**
     * @brief writeProgramDPointData        将DP点位数据组合成指令形式写入至文件中
     * @param programStrList                保存写入文件字符串的容器
     * @param dpIndex                       DP点位索引
     * @return
     */
    int writeProgramDPointData(QVector <QString> &programStrList, int dpIndex);

};

#endif // FILEDATA_H
